/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class ReconhecerTerminais {

    public ReconhecerTerminais() {
    }


    public NoArvore reconhecerIdentificador(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.removeFirst();

        if (token.getToken().equals("identificador")) {
            return new NoArvore("identificador", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta identificador", estrutura, token.getLinha());
        throw erro;
    }

    /**
     * Reconhece terminal "("
     * @param listaTokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     * @throws ErroSintaticoException
     */
    public NoArvore reconhecerParenteseAbrindo(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException{
    	if (listaTokens.getFirst().getLexema().equals("(")){
    		listaTokens.removeFirst();
    		return new NoArvore("(", true);
    	}else{
    		ErroSintaticoException erro = new ErroSintaticoException();
    		erro.addErros("Falta parentese abrindo", estrutura, listaTokens.getFirst().getLinha());
    		throw erro;
    	}
    }

    /**
     * Reconhece terminal ")"
     * @param listaTokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     * @throws ErroSintaticoException
     */
    public NoArvore reconhecerParenteseFechando(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException{
    	if (listaTokens.getFirst().getLexema().equals(")")){
    		listaTokens.removeFirst();
    		return new NoArvore(")", true);
    	}else{
    		ErroSintaticoException erro = new ErroSintaticoException();
    		erro.addErros("Falta parentese fechando", estrutura, listaTokens.getFirst().getLinha());
    		throw erro;
    	}
    }
     /**
     * Reconhece terminal ";"
     * @param listaTokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     * @throws ErroSintaticoException
     */
    public NoArvore reconhecerPontoeVirgula(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException{
        if (listaTokens.getFirst().getLexema().equals(";")){
    		listaTokens.removeFirst();
    		return new NoArvore(";", true);
    	}else{
    		ErroSintaticoException erro = new ErroSintaticoException();
    		erro.addErros("Falta ponto e vírgula", estrutura, listaTokens.getFirst().getLinha());
    		throw erro;
    	}
    }

    public NoArvore reconhecerAsterisco (LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException{
        LinkToken token = listaTokens.removeFirst();
        if(token.getToken().equals("operador_multiplicacao")){
            return new NoArvore("operador_multiplicacao", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta operador multiplicacao*", estrutura, token.getLinha());
        throw erro;
    }

     
   public NoArvore reconhecerOu(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.removeFirst();

        if (token.getLexema().equals("||")) {
            return new NoArvore("operador_logico", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta operador logico", estrutura, token.getLinha());
        throw erro;
    }

   public NoArvore reconhecerAnd(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.removeFirst();

        if (token.getLexema().equals("&&")) {
            return new NoArvore("operador_logico", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta operador logico", estrutura, token.getLinha());
        throw erro;
    }




}

